package com.longway.common.safe;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
import com.jfinal.kit.Ret;

public class CsrfInterceptor implements Interceptor {
 
	CsrfTokenService scrfTokenService = CsrfTokenService.me;
	
	@Override
	public void intercept(Invocation inv) {
		Controller c=inv.getController();
		String methName=inv.getMethod().getName();
		//给新增页面和修改页面添加csrfToken值
		if(methName.equals("add")||methName.equals("edit")){
			//请求方法为 新增页面和编辑页面时,给页面返回csrfToken标志属性
			scrfTokenService.createsCrfToken(c);		
		}
		
		//调用新增页面与编辑页面中的保存方法时,验证csrfToken是否正确
		if(methName.equals("save")||methName.equals("update")){
			boolean flag = scrfTokenService.validateCsrfToken(c);
			//验证不通过,有可能是csrf伪造请求
			if(!flag){
				boolean isajax = "XMLHttpRequest".equalsIgnoreCase(c.getHeader("X-Requested-With"));
				if(isajax){
					c.renderJson(Ret.fail("msg", "csrfToken验证不通过"));
				}else{
					c.setAttr("msg", "csrfToken验证不通过");
					c.renderError(403);
				}
				return;
			}
			//由于业务原因保存与修改未保存成功,则重新赋值新的csrfToken
			scrfTokenService.createsCrfToken(c);	
		}
		inv.invoke();
	}
}